package com.Algorithm.HUAWEI.four20220505;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zjz
 * @Date: 2022/05/20/10:38
 * @Description:
 * @Target:
 */
public class HJ67_24点游戏算法 {
    /*
    *
    * 描述
    给出4个1-10的数字，通过加减乘除运算，得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求，
    * 但每个数字仅允许使用一次，且需考虑括号运算
    此题允许数字重复，如3 3 4 4为合法输入，此输入一共有两个3，但是每个数字只允许使用一次，则运算过程中两个3都被选取并进行对应的计算操作。
    输入描述：
    读入4个[1,10]的整数，数字允许重复，测试用例保证无异常数字。

    输出描述：
    对于每组案例，输出一行表示能否得到24点，能输出true，不能输出false

    示例1
    输入：
    7 2 1 10

    输出：
    true

    *
    * */




    private static boolean[] vis = new boolean[4];
    private static boolean flag;


    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String[] s1 = in.readLine().split(" ");
        int[] numArray = new int[4];

        for (int i = 0; i < s1.length; i++) {
            if (s1[i]!=null){
                numArray[i] = Integer.valueOf(s1[i]);
            }
        }

        dfs(0,0,numArray);

        if (flag==true){
            System.out.println("true");
        }else {
            System.out.println("false");
        }


    }



    static void dfs(int step,double sum,int[] numArray){
        if(step == 4){
            if(sum == 24){
                flag = true;
            }else {
                if (flag!=true){
                    flag = false;
                }
            }
        }else{
            step++;
            for(int i = 0;i < 4;i++){
                if(vis[i]==false){
                    vis[i]=true;   // 问题一，为啥要用这个vis，之前遍历(从上而下的，还有从下而上的层数)跑了的元素，不会再跑
//                    System.out.println("vis[i]为："+vis[i]);
                    dfs(step,sum+numArray[i],numArray);  // 问题二，这些dfs应该是全部都要跑吧？
//                    System.out.println("+  "+step+" sum为："+sum + " num为"+numArray[i]);
                    dfs(step,sum-numArray[i],numArray);
//                    System.out.println("-   "+step+" sum为："+sum + " num为"+numArray[i]);
                    dfs(step,sum*numArray[i],numArray);
//                    System.out.println("*   "+step+" sum为："+sum + " num为"+numArray[i]);
                    dfs(step,sum/numArray[i],numArray);
//                    System.out.println("/   "+step+" sum为："+sum + " num为"+numArray[i]);
                    vis[i]=false;
                }

            }
        }

    }
}
